/*
 * @Description: 图层样式基类
 * @Author: cgt
 * @Date: 2022-01-05 17:06:43
 * @LastEditors: cgt
 * @LastEditTime: 2022-01-07 16:07:29
 */
import LayerConfig from '../constant/LayerConfig';
export default class ILayerStyle {
  constructor(style) {
    this.style = style;
    this.defaultLayout = {};
    this.defaultPaint = {};
    window.LayerConfig = LayerConfig;
  }

  getLayoutConfig() {
    return LayerConfig[`layout_${this.type}`];
  }
  getPaintConfig() {
    return LayerConfig[`paint_${this.type}`];
  }

  getLayoutOrPaint(config, defaultProp) {


    var layout = {};
    Object.keys(config).forEach(prop => {
      var dbProp = this.formatDbProp(prop);
      if(Object.prototype.hasOwnProperty.call(this.style, dbProp)) {
        // 数据库是否有配置当前属性
        var dbValue = this.style[dbProp];
        if(this.isJSONText(dbValue)) {
          layout[prop] = JSON.parse(dbValue);
        }else if(dbValue === undefined || dbValue === null || dbValue === '') {
          // 为undefined 或者 null 表示数据库里未配置，先获取自定义默认配置，再获取底层设置的默认值
          if(Object.prototype.hasOwnProperty.call(defaultProp, prop)) {
            layout[prop] = defaultProp[prop];
          } else if(Object.prototype.hasOwnProperty.call(config[prop], 'default')) {
            layout[prop] = config[prop].default;
          }
        }else{
          layout[prop] = this.formatValueType(dbValue, config[prop]);
        }
      } else if(Object.prototype.hasOwnProperty.call(defaultProp, prop)) {
        layout[prop] = defaultProp[prop];
      }else if(Object.prototype.hasOwnProperty.call(config[prop], 'default')) {
        // 取默认值
        layout[prop] = config[prop].default;
      }
    });
    return layout;
  }

  getLayout() {
    return this.getLayoutOrPaint(this.getLayoutConfig(), this.defaultLayout);
  }

  getPaint() {
    return this.getLayoutOrPaint(this.getPaintConfig(), this.defaultPaint);
  }

  /**
   * 判断当前字符串是否可转JSON
   * @param {String} text
   * @returns
   */
  isJSONText(text) {
    try {
      JSON.parse(text);
    } catch (error) {
      return false;
    }
    return true;
  }

  /**
   * 将图层属性名，转换为数据库属性名
   * 横杠 转为下划线
   * @param {String} prop 图层属性
   * @returns
   */
  formatDbProp(prop) {
    return prop.replace(/-/g, '_');
  }

  /**
   * 将值根据配置转成特定格式
   * @param {String} value 需要转换的值
   * @param {Object} config 属性配置
   * @returns
   */
  formatValueType(value, config) {
    var type = config.type;
    var formattedValue = value;
    switch (type) {
      case 'number':
        formattedValue = Number(value);
        break;
      case 'enum':
        break;
      case 'boolean':
        break;
      case 'array':
        break;
      case 'string':
        break;
      case 'formatted':
        break;

      default:
        break;
    }
    return formattedValue;
  }
}